"""
登录的时候，将cookie数据合并到redis中

前端：

后端：
    请求:         在登录的时候，获取cookie
    业务逻辑:       合并到redis中
    响应:

抽象的问题具体化解决
# 1.读取cookie数据
# 2.初始化一个字典用于保存sku_id:count
#     初始化一个列表用于保存商品id
#     初始化一个列表 用于保存未选择的商品id
# 3. 遍历cookie数据
# 4. 将字典数据，列表数据分别添加到redis中
# 5. 删除cookie数据

①当cookie数据和redis数据有相同的商品id时，以cookie为主
②当cookie有的，redis没有的，全部以cookie为主
③当redis中有的数据，cookie没有，不动


"""
import base64
import pickle

from django_redis import get_redis_connection


def merge_cookie_to_redis(request, response):
    # 1.读取cookie数据
    cookie_carts = request.COOKIES.get('carts')
    if cookie_carts is not None:
        carts = pickle.loads(base64.b64decode(cookie_carts))

        # 2.初始化一个字典用于保存sku_id:count
        cookie_dict = {}
        #     初始化一个列表用于保存商品id
        selected_ids = []
        #     初始化一个列表 用于保存未选择的商品id
        unselected_ids = []

        # 3. 遍历cookie数据
        for sku_id, count_selected_dict in carts.items():
            cookie_dict[sku_id] = count_selected_dict['count']
            if count_selected_dict['selected']:
                selected_ids.append(sku_id)
            else:
                unselected_ids.append(sku_id)

        # 4. 将字典数据，列表数据分别添加到redis中
        redis_cli = get_redis_connection('carts')
        pipeline = redis_cli.pipeline()

        pipeline.hmset('carts_%s' % request.user.id, cookie_dict)
        if len(selected_ids) > 0:
            pipeline.sadd('selected_%s' % request.user.id, *selected_ids)

        if len(unselected_ids) > 0:
            pipeline.srem('selected_%s' % request.user.id, *unselected_ids)

        pipeline.execute()
        # 5. 删除cookie数据
        response.delete_cookie('carts')

        return response
